package scala.function

/**
 * 函数可以作为参数进行传递
 */
case object FunctionDeclareTest05 {
  def main(args: Array[String]): Unit = {
    //(1)定义一个函数，函数参数还是一个函数签名，
    // f表示函数名称；（Int，Int）表示输入两个Int参数；Int表示函数返回值
    def f1(f: (Int, Int) => Int): Int = f(10, 4)

    //两数相加
    def add(a: Int, b: Int): Int = a + b

    //两数相减
    def sub(a: Int, b: Int): Int = a - b;

    //两数相乘
    def multiplication(a: Int, b: Int): Int = a * b;

    //两数相除
    def division(a: Int, b: Int): Int = a / b;

    //(3) 将add函数作为参数传递给f1函数，如果能够推断出来不是调用，_可以省略
    println(f1(add))
    println(f1(add _))
    println(f1(sub _))
    println(f1(multiplication _))
    println(f1(division _))

    println("分割线--------------------------------------------")

    def ff1() = {
      def f2() = {

      }

      f2 _
    }

    val f = ff1()
    //    因为函数f1的返回值依然为函数，所以变量f可以作为函数继续调用
    f()

    //    上面的代码可以简化为
    ff1()()
  }
}
